﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LCTMoodle.Service;
using LCTMoodle.Models.ViewModels;
using LCTMoodle.Helper;

namespace LCTMoodle.Controllers
{
    public class KhoaHoc_NhomQuyenController : Controller
    {
        #region Quản lý quyền
        /// <summary>
        /// Trang quản lý quyền
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        public ActionResult QuanLyQuyen(int ma)
        {
            //Lấy quyền của người dùng trong khóa học
            Dictionary<int, string> danhSachQuyen = (Dictionary<int, string>)Session["Quyen"];

            //Nếu quyền đã tồn tại => cập nhật
            if (danhSachQuyen.ContainsKey(ma))
            {
                danhSachQuyen[ma] = QuyenService.layQuyenTheoMaKhoaHocVaMaNguoiDung(ma, Session["NguoiDung"] != null ? ((NguoiDungViewModel)Session["NguoiDung"]).ma : -1);
            }
            //Nếu không => tạo mới
            else
            {
                danhSachQuyen.Add(ma, QuyenService.layQuyenTheoMaKhoaHocVaMaNguoiDung(ma, Session["NguoiDung"] != null ? ((NguoiDungViewModel)Session["NguoiDung"]).ma : -1));
            }

            //Kiểm tra nếu lấy dữ liệu thất bại
            if (danhSachQuyen[ma] == string.Empty)
            {
                TempData["ThongBao"] =
                    new string[]
                    {
                        "Lấy quyền thất bại"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            //Kiểm tra nếu người dùng không có quyền => chuyển hướng
            if (danhSachQuyen[ma].IndexOf("|10|") == -1)
            {
                TempData["ThongBao"] =
                    new string[]
                    {
                        "Bạn không có quyền phân quyền cho nhóm này"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            KhoaHocViewModel khoaHoc = KhoaHocService.layKhoaHocTheoMaKhoaHoc(ma);

            //Kiểm tra nếu lấy dữ liệu thất bại
            if (khoaHoc == null)
            {
                TempData["ThongBao"] =
                    new string[]
                    {
                        "Lấy thông tin khóa học thất bại"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            return View(khoaHoc);
        }

        /// <summary>
        /// Xử lý cập nhật quyền của nhóm quyền
        /// </summary>
        /// <param name="maNhomQuyen">Mã nhóm quyền</param>
        /// <param name="maQuyen">Mã quyền cần cập nhật</param>
        /// <param name="them">true nếu thêm quyền vào nhóm quyền, false nếu xóa quyền khỏi nhóm quyền</param>
        public ContentResult XuLyCapNhatQuyen(int maNhomQuyen, int maQuyen, bool them)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Điều chỉnh quyền)");
            }
            int maKhoaHoc = KhoaHocService.layMaKhoaHocTheoMaNhomQuyen(maNhomQuyen);
            if (maKhoaHoc == 0)
            {
                return Content("Lấy mã khóa học thất bại (Điều chỉnh quyền)");
            }
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "10"))
            {
                case 0:
                    break;
                case 1:
                    return Content("Lấy quyền thất bại (Điều chỉnh quyền)");
                case 2:
                    return Content("Không có quyền điều chỉnh nhóm quyền");
                default:
                    break;
            }
            //Không thể tắt quyền vào nhóm của các nhóm quyền không phải là khách
            if (maQuyen == 1 && !them && NhomQuyenService.layNhomQuyenTheoMaNhomQuyen(maNhomQuyen).tenNhomQuyen != "Khách")
            {
                return Content("Không có quyền vào nhóm của nhóm không phải khách");
            }
            #endregion Kiểm tra quyền

            if (KhoaHoc_NhomQuyenService.capNhatThemXoaQuyenTheoMaKhoaHocVaMaNhomQuyen(maKhoaHoc, maNhomQuyen, maQuyen, them))
            {
                return Content("OK");
            }
            return Content("Điều chỉnh quyền của nhóm quyền thất bại");
        }

        /// <summary>
        /// Lấy thành viên không thuộc nhóm quyền
        /// (Để thêm thành viên vào nhóm quyền)
        /// </summary>
        /// <param name="maKhoaHoc">Mã khóa học</param>
        /// <param name="maNhomQuyen">Mã nhóm quyền</param>
        /// <param name="thongTin">Thông tin tìm kiếm</param>
        /// <returns>Mã, họ tên</returns>        
        public JsonResult XuLyTimKiemDanhSachThanhVienKhongCuaNhomQuyen(int maKhoaHoc, int maNhomQuyen, string thongTin)
        {
            #region Kiểm tra quyền
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "1"))
            {
                case 0:
                    break;
                case 1:
                    return Json(new
                        {
                            trangThai = "Lấy quyền thất bại (Lấy thành viên không thuộc nhóm quyền)"
                        });
                case 2:
                    return Json(new
                    {
                        trangThai = "Không có quyền lấy thành viên không thuộc nhóm quyền"
                    });
                default:
                    break;
            }
            #endregion Kiểm tra quyền

            List<NguoiDungViewModel> nguoiDung = NguoiDungService.layNguoiDungTheoMaKhoaHocVaMaNhomQuyenVaThongTin_TimKiemThanhVienKhongCuaNhomQuyen(maKhoaHoc, maNhomQuyen, thongTin);
            if (nguoiDung == null)
            {
                return Json(new
                    {
                        trangThai = "Lấy danh sách thành viên thất bại"
                    });
            }

            return Json(new
                {
                    trangThai = "OK",
                    ketQua = nguoiDung
                });
        }
        
        /// <summary>
        /// Lấy danh sách các nhóm quyền của khóa học
        /// </summary>
        /// <param name="maKhoaHoc">Mã khóa học</param>
        /// <returns></returns>
        public JsonResult XuLyLayDanhSachNhomQuyen(int maKhoaHoc)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Json(new 
                    {
                        trangThai = "Chưa đăng nhập (Lấy danh sách nhóm quyền)"
                    });
            }
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "10"))
            {
                case 0:
                    break;
                case 1:
                    return Json(new
                    {
                        trangThai = "Lấy quyền thất bại (Lấy danh sách nhóm quyền)"
                    });
                case 2:
                    return Json(new
                    {
                        trangThai = "Không có quyền lấy danh sách nhóm quyền"
                    });
                default:
                    break;
            }
            #endregion Kiểm tra quyền

            List<NhomQuyenViewModel> nhomQuyen = KhoaHoc_NhomQuyenService.layKhoaHocNhomQuyenTheoMaKhoaHoc(maKhoaHoc);
            if (nhomQuyen == null)
            {
                return Json(new
                {
                    trangThai = "Lấy danh sách nhóm quyền thất bại"
                });
            }

            return Json(new
            {
                trangThai = "OK",
                ketQua = ControllerHelper.RenderRazorViewToString("~/Views/KhoaHoc_NhomQuyen/DanhSachNhomQuyen.cshtml", nhomQuyen)
            });
        }

        /// <summary>
        /// Lấy danh sách các quyền của nhóm quyền đó
        /// </summary>
        /// <param name="maNhomQuyen">Mã nhóm quyền</param>
        public JsonResult XuLyLayChuoiMaQuyen(int maNhomQuyen)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Json(new
                {
                    trangThai = "Chưa đăng nhập (Lấy chuỗi mã quyền)"
                });
            }
            int maKhoaHoc = KhoaHocService.layMaKhoaHocTheoMaNhomQuyen(maNhomQuyen);
            if (maKhoaHoc == 0)
            {
                return Json(new
                {
                    trangThai = "Lấy mã khóa học thất bại (Lấy chuỗi mã quyền)"
                });
            }
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "10"))
            {
                case 0:
                    break;
                case 1:
                    return Json(new
                    {
                        trangThai = "Lấy quyền thất bại (Lấy chuỗi mã quyền)"
                    });
                case 2:
                    return Json(new
                    {
                        trangThai = "Không có quyền lấy chuỗi mã quyền"
                    });
                default:
                    break;
            }
            #endregion Kiểm tra quyền

            string chuoiMaQuyen = KhoaHoc_NhomQuyenService.layChuoiMaQuyenTheoMaKhoaHocVaMaNhomQuyen(maKhoaHoc, maNhomQuyen);

            if (chuoiMaQuyen == null)
            {
                return Json(new
                {
                    trangThai = "Lấy chuỗi mã quyền thất bại"
                });
            }

            return Json(new
            {
                trangThai = "OK",
                ketQua = chuoiMaQuyen
            });
        }

        /// <summary>
        /// Lấy danh sách thành viên thuộc nhóm quyền
        /// </summary>
        /// <param name="maNhomQuyen">Mã nhóm quyền</param>
        /// <returns></returns>
        public JsonResult XuLyLayDanhSachThanhVienCuaNhomQuyen(int maNhomQuyen)
        {
            List<NguoiDungViewModel> nguoiDung = NguoiDungService.layNguoiDungTheoMaNhomQuyen(maNhomQuyen);

            //Kiểm tra nếu lấy dữ liệu thất bại
            if (nguoiDung == null)
            {
                return Json(new
                {
                    trangThai = "Lấy danh sách người dùng thất bại"
                });
            }

            return Json(new
            {
                trangThai = "OK",
                ketQua = ControllerHelper.RenderRazorViewToString("~/Views/KhoaHoc_NhomQuyen/DanhSachThanhVien.cshtml", nguoiDung)
            });
        }
        /// <summary>
        /// Tạo thêm nhóm quyền cho khóa học
        /// </summary>
        /// <param name="maKhoaHoc">Mã khóa học</param>
        /// <param name="tenNhomQuyen">Tên nhóm quyền cần thêm</param>
        public JsonResult XuLyThemNhomQuyen(int maKhoaHoc, string tenNhomQuyen)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Json(new
                {
                    trangThai = "Chưa đăng nhập (Thêm nhóm quyền)"
                });
            }
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "10"))
            {
                case 0:
                    break;
                case 1:
                    return Json(new
                    {
                        trangThai = "Lấy quyền thất bại (Thêm nhóm quyền)"
                    });
                case 2:
                    return Json(new
                    {
                        trangThai = "Không có quyền thêm nhóm quyền"
                    });
                default:
                    break;
            }
            #endregion Kiểm tra quyền

            int maNhomQuyen = KhoaHoc_NhomQuyenService.themKhoaHocNhomQuyen(maKhoaHoc, tenNhomQuyen);
            if (maNhomQuyen == 0)
            {
                return Json(new
                {
                    trangThai = "Thêm nhóm quyền thất bại"
                });
            }

            //Lấy về nhóm quyền cần thêm để thực hiện ajax
            List<NhomQuyenViewModel> nhomQuyen = new List<NhomQuyenViewModel>();
            nhomQuyen.Add(new NhomQuyenViewModel() { ma = maNhomQuyen, tenNhomQuyen = tenNhomQuyen });

            return Json(new
            {
                trangThai = "OK",
                ketQua = ControllerHelper.RenderRazorViewToString("~/Views/KhoaHoc_NhomQuyen/DanhSachNhomQuyen.cshtml", nhomQuyen)
            });
        }

        /// <summary>
        /// Xóa nhóm quyền theo mã nhóm quyền
        /// </summary>
        /// <param name="maNhomQuyen">Mã nhóm quyền</param>
        public ContentResult XuLyXoaNhomQuyen(int maNhomQuyen)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Xóa nhóm quyền)");
            }
            int maKhoaHoc = KhoaHocService.layMaKhoaHocTheoMaNhomQuyen(maNhomQuyen);
            if (maKhoaHoc == 0)
            {
                return Content("Lấy mã khóa học thất bại (Xóa nhóm quyền)");
            }
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "10"))
            {
                case 0:
                    break;
                case 1:
                    return Content("Lấy quyền thất bại (Xóa nhóm quyền)");
                case 2:
                    return Content("Không có quyền xóa nhóm quyền");
                default:
                    break;
            }
            //Không thể xóa nhóm quyền thành viên và khách
            switch (NhomQuyenService.layNhomQuyenTheoMaNhomQuyen(maNhomQuyen).tenNhomQuyen)
            {
                case "Khách":
                    return Content("Không thể xóa nhóm quyền khách");
                case "Thành viên":
                    return Content("Không thể xóa nhóm quyền thành viên");
                default: 
                    break;
            }
            #endregion Kiểm tra quyền

            if (KhoaHoc_NhomQuyenService.xoaKhoaHocNhomQuyenTheoMaKhoaHocVaMaNhomQuyen(maKhoaHoc, maNhomQuyen))
            {
                return Content("OK");
            }
            else
            {
                return Content("Xóa nhóm quyền thất bại");
            }
        }

        /// <summary>
        /// Thêm thành viên vào nhóm quyền
        /// </summary>
        /// <param name="maKhoaHoc">Mã khóa học</param>
        /// <param name="maNhomQuyen">Mã nhóm quyền</param>
        /// <param name="maThanhVien">Mã thành viên</param>
        public ContentResult XuLyThemThanhVienVaoNhomQuyen(int maKhoaHoc, int maNhomQuyen, int maThanhVien)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Thêm thành viên vào nhóm quyền)");
            }
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "10"))
            {
                case 0:
                    break;
                case 1:
                    return Content("Lấy quyền thất bại (Thêm thành viên vào nhóm quyền)");
                case 2:
                    return Content("Không có quyền thêm thành viên vào nhóm quyền");
                default:
                    break;
            }
            //Không thể thêm thành viên vào nhóm quyền khách
            if (NhomQuyenService.layNhomQuyenTheoMaNhomQuyen(maNhomQuyen).tenNhomQuyen == "Khách")
            {
                return Content("Không có quyền thêm thành viên vào nhóm quyền khách");
            }
            #endregion Kiểm tra quyền

            if (KhoaHoc_NhomQuyenService.capNhatKhoaHocNhomQuyenTheoMaKhoaHocVaMaNhomQuyenVaMaThanhVien_ThemThanhVienVaoNhomQuyen(maKhoaHoc, maNhomQuyen, maThanhVien))
            {
                return Content("OK");
            }
            return Content("Thêm thành viên vào nhóm quyền thất bại");
        }

        /// <summary>
        /// Xóa thành viên khỏi nhóm quyền
        /// </summary>
        /// <param name="maKhoaHoc">Mã khóa học</param>
        /// <param name="maNhomQuyen">Mã nhóm quyền</param>
        /// <param name="maThanhVien">Mã thành viên</param>
        public ContentResult XuLyXoaThanhVienKhoiNhomQuyen(int maKhoaHoc, int maNhomQuyen, int maThanhVien)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Xóa thành viên khỏi nhóm quyền)");
            }
            switch (TienIch.kiemTraQuyenTrongKhoaHoc(maKhoaHoc, "10"))
            {
                case 0:
                    break;
                case 1:
                    return Content("Lấy quyền thất bại (Xóa thành viên khỏi nhóm quyền)");
                case 2:
                    return Content("Không có quyền xóa thành viên khỏi nhóm quyền");
                default:
                    break;
            }
            //Không thể xóa thành viên khỏi nhóm quyền thành viên
            switch (NhomQuyenService.layNhomQuyenTheoMaNhomQuyen(maNhomQuyen).tenNhomQuyen)
            {
                case "Khách":
                    return Content("Không có quyền xóa thành viên khỏi nhóm quyền khách");
                case "Thành viên":
                    return Content("Không có quyền xóa thành viên khỏi nhóm quyền thành viên");
                default:
                    break;
            }
            #endregion Kiểm tra quyền

            if (KhoaHoc_NhomQuyenService.capNhatKhoaHocNhomQuyenTheoMaKhoaHocVaMaNhomQuyenVaMaThanhVien_XoaThanhVienKhoiNhomQuyen(maKhoaHoc, maNhomQuyen, maThanhVien))
            {
                return Content("OK");
            }
            return Content("Xóa thành viên khỏi nhóm quyền thất bại");
        }
        #endregion Quản lý quyền
    }
}
